package com.flansmod.common.teams;

import com.flansmod.common.FlansMod;
import com.flansmod.common.network.PacketBaseEdit;
import com.flansmod.common.types.IFlanItem;
import com.flansmod.common.types.InfoType;

import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

public class ItemOpStick extends Item implements IFlanItem
{
	public static final String[] teamNames = new String[] {"No Team", "Spectators", "Team 1", "Team 2"};	
	public static final String[] stickNames = new String[] {"opStick_ownership", "opStick_connecting", "opStick_mapping", "opStick_destruction"};

	public ItemOpStick()
	{
		super();
		setUnlocalizedName("opStick");
		setHasSubtypes(true);
	}
		
	@Override
	public boolean shouldRotateAroundWhenRendering()
	{
		return true;
	}
	
	@Override
	public boolean isFull3D()
	{
		return true;
	}
	
	public void clickedEntity(World world, EntityPlayer player, Entity clicked)
	{
		if(!(player instanceof EntityPlayerMP))
			return;
		if(clicked instanceof ITeamBase)
			clickedBase(world, (EntityPlayerMP)player, (ITeamBase)clicked);
		if(clicked instanceof ITeamObject)
			clickedObject(world, (EntityPlayerMP)player, (ITeamObject)clicked);
	}
	
	public static void openBaseEditGUI(ITeamBase base, EntityPlayerMP player)
	{
		String[] maps = new String[TeamsManager.getInstance().maps.values().size()];
		if(maps.length == 0)
		{
			//There are no maps setup. Disaster! Abort.
			TeamsManager.messagePlayer(player, "Maps are not yet set up. Use /teams help");
			return;
		}
		int currentMapID = -1;
		int i = 0;
		for(TeamsMap map : TeamsManager.getInstance().maps.values())
		{
			maps[i] = map.name;
			if(map == base.getMap())
				currentMapID = i;
			i++;
		}
		FlansMod.getPacketHandler().sendTo(new PacketBaseEdit(base.getBaseID(), base.getBaseName(), maps, currentMapID, base.getDefaultOwnerID()), player);

	}
	
	public void clickedBase(World world, EntityPlayerMP player, ITeamBase base)
	{
		if(!world.isRemote)
		{
			int damage = player.inventory.getCurrentItem().getItemDamage(); 
			TeamsManager teamsManager = TeamsManager.getInstance();
			switch(damage)
	    	{
		    	case 0 : //Stick of Ownership
		    	{
		    		//Take the existing ownerID, increment it (mod 4 for now - assume all gametypes involve 2 teams)
		    		int currentOwnerID = base.getDefaultOwnerID();
		    		currentOwnerID++;
		    		currentOwnerID = currentOwnerID % 4;
		    		base.setDefaultOwnerID(currentOwnerID);
		    		base.setOwnerID(currentOwnerID);
		    		
		    		for(ITeamObject object : base.getObjects())
		    			object.onBaseSet(currentOwnerID);
		    		
		    		TeamsManager.messagePlayer(player, "Base owner changed to " + teamNames[currentOwnerID]);
	
		    		break;
		    	}
		    	case 1 : //Stick of Connecting
		    	{
		    		if(player.fishEntity == null)
		    		{
		    			EntityConnectingLine hook = new EntityConnectingLine(world, player, base);
		    			world.spawnEntityInWorld(hook);
		    		}
		    		else
		    		{
		    			if(player.fishEntity instanceof EntityConnectingLine)
		    			{
		    				EntityConnectingLine line = (EntityConnectingLine)player.fishEntity;
		    				if(line.connectedTo instanceof ITeamObject)
		    				{
		    					ITeamObject object = (ITeamObject)line.connectedTo;
		    					object.setBase(base);
		    					base.addObject(object);
		    					line.setDead();
		    					player.fishEntity = null;
		    					TeamsManager.messagePlayer(player, "Successfully connected.");
		    				}
		    				else
		    				{
		    					TeamsManager.messagePlayer(player, "Cannot connect bases to bases.");
		    				}
		    			}
		    		}
		    		break;
		    	}
		    	case 2 : //Stick of Mapping
		    	{
		    		openBaseEditGUI(base, player);
		    		break;
		    	}
		    	case 3 : //Stick of Destruction
		    	{
		    		base.destroy();
		    		break;
		    	}
	    	}
    	}
	}
	
	public void clickedObject(World world, EntityPlayerMP player, ITeamObject object)
	{
		int damage = player.inventory.getCurrentItem().getItemDamage(); 
		TeamsManager teamsManager = TeamsManager.getInstance();
		switch(damage)
		{
			case 0 : //Stick of Ownership
			{
				//Do nothing. Ownership is a property of bases.
				break;
			}
			case 1 : //Stick of Connecting
			{
				if(player.fishEntity == null)
				{
					EntityConnectingLine hook = new EntityConnectingLine(world, player, object);
					world.spawnEntityInWorld(hook);
				}
				else
				{
					if(player.fishEntity instanceof EntityConnectingLine)
					{
						EntityConnectingLine line = (EntityConnectingLine)player.fishEntity;
						if(line.connectedTo instanceof ITeamBase)
						{
							ITeamBase base = (ITeamBase)line.connectedTo;
							object.setBase(base);
							base.addObject(object);
							//line.setDead();
							//player.fishEntity = null;
							TeamsManager.messagePlayer(player, "Successfully connected.");
						}
						else
						{
							TeamsManager.messagePlayer(player, "Cannot connect objects to objects.");
						}
					}
				}
				break;
			}
			case 2 : //Stick of Mapping
			{
				//Again, this is a property of bases. Objects will follow their parent base in regards to which map they are a part of
				break;
			}
			case 3 : //Stick of Destruction
			{
				object.destroy();
				break;
			}
		}
	}
	
	@Override
    public String getUnlocalizedName(ItemStack stack)
    {
        return super.getUnlocalizedName() + "." + stack.getItemDamage();
    }

	@Override
	public InfoType getInfoType() 
	{
		return null;
	}
}
